package com.gen;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.InjectionConfig;
import com.baomidou.mybatisplus.generator.config.*;
import com.baomidou.mybatisplus.generator.config.po.TableInfo;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
import org.apache.commons.lang3.StringUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * @author kevin @Description CodeGenerator
 * @date 2019/6/5
 */
/**
 * @author kevin @Description CodeGenerator
 * @date 2019/6/5
 */
public class CodeGenerator {

  public static void main(String[] args) {
    DataSourceVO dataSourceGmall =
//            new DataSourceVO(
//                    "gpmart",
//                    "Gpmart_3081",
//                    "jdbc:mysql://rm-2zej69xl9lur3f3ktfo.mysql.rds.aliyuncs.com:3306/gpmart_qxndb?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=Asia/Shanghai");
            new DataSourceVO(
                    "cwy_demo",
                    "1",
                    "jdbc:oracle:thin:@10.16.24.126:1521:ufgovdb1");

    String[] tables = new String[]{"UR_PRINT_DS_FIELD"};

    String[] tablePrefixs = new String[]{"UR_"};
    executeCode(dataSourceGmall, "/Users/guanfeng/Desktop", "com.ufgov.ur.print", tables, tablePrefixs);
  }


  private static void executeCode(
          DataSourceVO dataSourceGmall,
          String OutputDir,
          String pack,
          String[] tables,
          String[] tablePrefixs) {
    final String projectPath = OutputDir;
    // 代码生成器
    AutoGenerator mpg = new AutoGenerator();

    // 全局配置
    GlobalConfig gc = new GlobalConfig();
    // 是否覆盖已有文件
    gc.setFileOverride(true);
    // 生成文件的输出目录
    gc.setOutputDir(projectPath + "/src/main/java");
    gc.setEntityName("%s");
    // 开发人员
    gc.setAuthor("guanfenga@yonyou.com");
    // 是否打开输出目录
    gc.setOpen(false);
    // 开启 BaseResultMap
    gc.setBaseResultMap(true);
    // 指定生成的主键的ID类型
    gc.setIdType(IdType.ASSIGN_UUID);
    // 时间类型对应策略: 只使用 java.util.date 代替
    gc.setDateType(DateType.ONLY_DATE);
    mpg.setGlobalConfig(gc);

    // 数据源配置
    DataSourceConfig dsc = new DataSourceConfig();
    // 从试图获取
    // dsc.setSchemaName("V_LAW_CAMERA");
    dsc.setUrl(dataSourceGmall.getUrl());
    dsc.setDriverName("oracle.jdbc.driver.OracleDriver");
//    dsc.setDriverName("com.mysql.jdbc.Driver");
    dsc.setUsername(dataSourceGmall.getUsername());
    dsc.setPassword(dataSourceGmall.getPassword());
    mpg.setDataSource(dsc);

    // 包配置
    PackageConfig pc = new PackageConfig();
    // 父包名。如果为空，将下面子包名必须写全部， 否则就只需写子包名
    pc.setParent(pack);
    // Entity包名
    pc.setEntity("entity");
    mpg.setPackageInfo(pc);

    // 自定义配置
    InjectionConfig cfg =
            new InjectionConfig() {
              @Override
              public void initMap() {
                // to do nothing
              }
            };
    List<FileOutConfig> focList = new ArrayList<>();
    focList.add(
            new FileOutConfig("/templates/mapper.xml.ftl") {
              @Override
              public String outputFile(TableInfo tableInfo) {
                // 自定义输入文件名称
                if (StringUtils.isEmpty(pc.getModuleName())) {
                  return projectPath
                          + "/src/main/resources/mapper/"
                          + tableInfo.getXmlName()
                          + StringPool.DOT_XML;
                } else {
                  return projectPath
                          + "/src/main/resources/mapper/"
                          + pc.getModuleName()
                          + "/"
                          + tableInfo.getXmlName()
                          + StringPool.DOT_XML;
                }
              }
            });
    cfg.setFileOutConfigList(focList);
    mpg.setCfg(cfg);
    mpg.setTemplate(new TemplateConfig().setXml(null));
    // 策略配置
    StrategyConfig strategy = new StrategyConfig();
    // RestController设置
    strategy.setRestControllerStyle(true);
    // 数据库表映射到实体的命名策略: 下划线转驼峰命名
    strategy.setNaming(NamingStrategy.underline_to_camel);
    // 数据库表字段映射到实体的命名策略: 下划线转驼峰命名
    strategy.setColumnNaming(NamingStrategy.underline_to_camel);
    // 【实体】是否为lombok模型（默认 false）
    strategy.setEntityLombokModel(true);
    strategy.setLogicDeleteFieldName("deleted");
    strategy.setVersionFieldName("update_version");
    // 需要包含的表名，允许正则表达式（与exclude二选一配置）
    strategy.setInclude(tables);
    // 驼峰转连字符
    strategy.setControllerMappingHyphenStyle(true);
    // 表前缀
    strategy.setTablePrefix(tablePrefixs);
    mpg.setStrategy(strategy);
    mpg.setTemplateEngine(new FreemarkerTemplateEngine());
    mpg.execute();
  }
}
